﻿using AntdUI;
using IniHelp;
using Newtonsoft.Json.Linq;
using SqlSugar.Extensions;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Media;
using TPMS_ScanComparison.Helper;
using TPMS_ScanComparison.Model;

namespace TPMS_ScanComparison.Contrals
{
    public partial class RecipeControl : UserControl
    {
        Form form;
        Font font = null;
        private static string path2 = System.Environment.CurrentDirectory;

        public static IniFile m_ini = new IniFile(path2 + "\\config.ini");


        public RecipeControl(Form _form)
        {
            form = _form;
            InitializeComponent();
            Load += RecipeControl_Load;
            #region Table

            table1.Columns = new AntdUI.ColumnCollection {
    // 第一列(Id列)设置为隐藏
    new AntdUI.Column("Id", "Id")
        .SetAlign()
        .SetLocalizationTitleID("Table.Column.")
        .SetVisible(false), // 添加此句设置列隐藏
    new AntdUI.ColumnRadio("check","是否选用").SetFixed(),
    new AntdUI.Column("recipe", "配方名称")
        .SetAlign()
        .SetWidth("220")
        .SetLocalizationTitleID("Table.Column.")
};
            #endregion

        }

        private async void RecipeControl_Load(object sender, EventArgs e)
        {
            await LoadRecipe();

        }
        // 加载所有配方数据（不分页）
        private async Task LoadRecipe()
        {
            // 异步加载所有数据，不进行分页
            List<RecipeModel> recipes = await Task.Run(() =>
                SqlHelper.sqliteDb.Queryable<RecipeModel>().ToList()
            );

            // 转换为表格所需的数据格式
            var tableData = recipes.Select(recipe => GetRecipeItem(recipe)).ToList();

            // 绑定到表格
            table1.DataSource = tableData;
        }

        // 转换RecipeModel为表格行数据（与列定义对应）
        AntdUI.AntItem[] GetRecipeItem(RecipeModel recipe)
        {
            return new AntdUI.AntItem[] {
        new AntdUI.AntItem("Id", recipe.Id),  // 配方名称
        new AntdUI.AntItem("check", false),  // 复选框默认值
        new AntdUI.AntItem("recipe", recipe.recipe)  // 配方名称
    };
        }
        private async void btn_AddRecipe_Click(object sender, EventArgs e)
        {
            // 1. 定义必填字段的校验规则（字段名 + 控件值 + 错误提示）
            var validationRules = new List<(string FieldName, string Value, string ErrorMsg)>
    {
        ("配方名称", lab_recipeName.Text, "配方名称不能为空"),
        ("产品名称", lab_prodouct.Text, "产品名称不能为空"),
        ("前缀", lab_prefix.Text, "前缀不能为空"),
        ("长度", lab_length.Text, "长度不能为空"),
        ("中间数量", lab_medium.Text, "中间数量不能为空"),
        ("外部数量", lab_out.Text, "外部数量不能为空")
    };

            // 2. 执行非空校验
            foreach (var rule in validationRules)
            {
                // 检查值是否为 null 或空白（排除纯空格的情况）
                if (string.IsNullOrWhiteSpace(rule.Value))
                {
                    Notification.warn(form, rule.ErrorMsg, "", TAlignFrom.Top, font, 3);
                    return; // 校验失败，直接返回，不执行后续操作
                }
            }

            // 3. 对数值类型字段进行格式校验（避免非数字值转换失败）
            if (!int.TryParse(lab_length.Text, out int length) || length <= 0)
            {
                Notification.warn(form, "长度必须为正整数", "", TAlignFrom.Top, font, 3);
                return;
            }
            if (!int.TryParse(lab_medium.Text, out int mediumCount) || mediumCount <= 0)
            {
                Notification.warn(form, "中间数量必须为正整数", "", TAlignFrom.Top, font, 3);
                return;
            }
            if (!int.TryParse(lab_out.Text, out int outerCount) || outerCount <= 0)
            {
                Notification.warn(form, "外部数量必须为正整数", "", TAlignFrom.Top, font, 3);
                return;
            }

            // 4. 所有校验通过，执行插入操作
            try
            {
                int insertCount = SqlHelper.sqliteDb.Insertable(new RecipeModel()
                {
                    recipe = lab_recipeName.Text.Trim(),       // 去除前后空格，避免无效空格
                    product = lab_prodouct.Text.Trim(),
                    prefix = lab_prefix.Text.Trim(),
                    length = length,                       // 使用校验后的数值
                    MediumCount = mediumCount,
                    OuterCount = outerCount
                }).ExecuteCommand();

                // 5. 插入结果反馈
                if (insertCount > 0)
                {
                    Notification.success(form, "添加成功", "", TAlignFrom.Top, font, 3);
                    await LoadRecipe(); // 重新加载表格数据

                    // 可选：清空输入框，方便下次添加
                    ClearInputFields();
                }
                else
                {
                    Notification.warn(form, "添加失败，未插入任何数据", "", TAlignFrom.Top, font, 3);
                }
            }
            catch (Exception ex)
            {
                Notification.error(form, $"添加出错：{ex.Message}", "", TAlignFrom.Top, font, 3);
            }
        }

        // 可选：清空所有输入框的辅助方法
        private void ClearInputFields()
        {
            lab_recipe.Text = "";
            lab_recipeName.Text = "";
            lab_prefix.Text = "";
            lab_length.Text = "";
            lab_medium.Text = "";
            lab_out.Text = "";
        }

        private async void btn_DelRecipe_Click(object sender, EventArgs e)
        {
            // 获取选中行索引（假设SelectedIndex返回的是int类型）
            int selectedIndex = table1.SelectedIndex;
            // 检查是否选中了有效行
            if (selectedIndex < 0)
            {
                Notification.warn(form, "请选择配方", "", TAlignFrom.Top, font, 3);
                return;
            }
            // 转换为数据行索引（如果需要减去表头）
            int rowIndex = selectedIndex - 1;
            // 获取表格数据源
            var tableData = table1.DataSource as List<AntdUI.AntItem[]>;
            // 获取当前行的AntItem数组
            var currentRowItems = tableData[rowIndex];
            var idItem = currentRowItems.FirstOrDefault(item => item.key == "Id");

            //删除
            AntdUI.Modal.open(new AntdUI.Modal.Config(form, "确认删除", "确定要删除选中的配方吗？此操作不可撤销。", AntdUI.TType.Warn)
            {
                OnButtonStyle = (id, btn) =>
                {
                    btn.BackExtend = "135, #6253E1, #04BEFE";
                },
                // 确认按钮回调
                OnBtns = btn =>
                {
                    return true;
                },
                OnOk = config =>
                {
                    SqlHelper.sqliteDb.Deleteable<RecipeModel>().Where(it => it.Id == idItem.value.ObjToInt()).ExecuteCommand();
                    Notification.success(form, "删除成功", "", TAlignFrom.Top, font, 3);
                    return true;
                },
                OkText = "确认删除",
                CancelText = "取消"
            });

            await LoadRecipe();

        }

        private async void btn_UpdateRecipe_Click(object sender, EventArgs e)
        {
            // 获取选中行索引（假设SelectedIndex返回的是int类型）
            int selectedIndex = table1.SelectedIndex;
            // 检查是否选中了有效行
            if (selectedIndex < 0)
            {
                Notification.warn(form, "请选择配方", "", TAlignFrom.Top, font, 3);
                return;
            }
            // 转换为数据行索引（如果需要减去表头）
            int rowIndex = selectedIndex - 1;
            // 获取表格数据源
            var tableData = table1.DataSource as List<AntdUI.AntItem[]>;
            // 获取当前行的AntItem数组
            var currentRowItems = tableData[rowIndex];
            var idItem = currentRowItems.FirstOrDefault(item => item.key == "Id");

            // 1. 定义必填字段的校验规则（字段名 + 控件值 + 错误提示）
            var validationRules = new List<(string FieldName, string Value, string ErrorMsg)>
    {
        ("配方名称", lab_recipeName.Text, "配方名称不能为空"),
        ("产品名称", lab_prodouct.Text, "产品名称不能为空"),
        ("前缀", lab_prefix.Text, "前缀不能为空"),
        ("长度", lab_length.Text, "长度不能为空"),
        ("中间数量", lab_medium.Text, "中间数量不能为空"),
        ("外部数量", lab_out.Text, "外部数量不能为空")
    };

            // 2. 执行非空校验
            foreach (var rule in validationRules)
            {
                // 检查值是否为 null 或空白（排除纯空格的情况）
                if (string.IsNullOrWhiteSpace(rule.Value))
                {
                    Notification.warn(form, rule.ErrorMsg, "", TAlignFrom.Top, font, 3);
                    return; // 校验失败，直接返回，不执行后续操作
                }
            }

            // 3. 对数值类型字段进行格式校验（避免非数字值转换失败）
            if (!int.TryParse(lab_length.Text, out int length) || length <= 0)
            {
                Notification.warn(form, "长度必须为正整数", "", TAlignFrom.Top, font, 3);
                return;
            }
            if (!int.TryParse(lab_medium.Text, out int mediumCount) || mediumCount <= 0)
            {
                Notification.warn(form, "中间数量必须为正整数", "", TAlignFrom.Top, font, 3);
                return;
            }
            if (!int.TryParse(lab_out.Text, out int outerCount) || outerCount <= 0)
            {
                Notification.warn(form, "外部数量必须为正整数", "", TAlignFrom.Top, font, 3);
                return;
            }

            // 4. 所有校验通过，执行插入操作
            try
            {
                int insertCount = SqlHelper.sqliteDb.Updateable(new RecipeModel()
                {
                    Id = idItem.value.ObjToInt(),
                    recipe = lab_recipeName.Text.Trim(),       // 去除前后空格，避免无效空格
                    product = lab_prodouct.Text.Trim(),
                    prefix = lab_prefix.Text.Trim(),
                    length = length,                       // 使用校验后的数值
                    MediumCount = mediumCount,
                    OuterCount = outerCount
                }).ExecuteCommand();

                // 5. 插入结果反馈
                if (insertCount > 0)
                {
                    Notification.success(form, "修改成功", "", TAlignFrom.Top, font, 3);
                    lab_recipe.Text = lab_recipeName.Text.Trim();
                    await LoadRecipe(); // 重新加载表格数据

                    // 可选：清空输入框，方便下次添加
                    //ClearInputFields();
                }
                else
                {
                    Notification.warn(form, "修改失败，未修改任何数据", "", TAlignFrom.Top, font, 3);
                }
            }
            catch (Exception ex)
            {
                Notification.error(form, $"修改出错：{ex.Message}", "", TAlignFrom.Top, font, 3);
            }
        }

        private void btn_ImportRecipe_Click(object sender, EventArgs e)
        {
            // 获取选中行索引（假设SelectedIndex返回的是int类型）
            int selectedIndex = table1.SelectedIndex;
            // 检查是否选中了有效行
            if (selectedIndex < 0)
            {
                Notification.warn(form, "请选择配方", "", TAlignFrom.Top, font, 3);
                return;
            }
            // 转换为数据行索引（如果需要减去表头）
            int rowIndex = selectedIndex - 1;
            // 获取表格数据源
            var tableData = table1.DataSource as List<AntdUI.AntItem[]>;
            // 获取当前行的AntItem数组
            var currentRowItems = tableData[rowIndex];
            var idItem = currentRowItems.FirstOrDefault(item => item.key == "Id");
            // 使用Id值进行查询操作（注意：需要根据实际Id类型调整，这里假设是int类型）
            var queryResult = SqlHelper.sqliteDb.Queryable<RecipeModel>()
                .Where(m => m.Id == Convert.ToInt32(idItem)) // 根据实际类型修改转换方式
                .First();
            m_ini.IniWriteValue("MediumCount", "MediumCount", queryResult.MediumCount);

            m_ini.IniWriteValue("OuterCount", "OuterCount", queryResult.OuterCount);

            m_ini.IniWriteValue("length", "length", queryResult.length);

            m_ini.IniWriteValue("ProductName", "ProductName", queryResult.product);

            m_ini.IniWriteValue("prefix", "prefix", queryResult.prefix);
            Notification.success(form, "加载配方成功", "", TAlignFrom.Top, font, 3);

        }



        private void table1_CellDoubleClick(object sender, TableClickEventArgs e)
        {
            var rowIndex = e.RowIndex - 1; // 当前行索引（减去1是因为表头）
            var columnIndex = e.ColumnIndex; // 当前列索引
            // 获取表格数据源（实际是List<AntdUI.AntItem[]>类型）
            var tableData = table1.DataSource as List<AntdUI.AntItem[]>;
            if (tableData == null || rowIndex < 0 || rowIndex >= tableData.Count)
            {
                return;
            }
            // 获取当前行的AntItem数组
            var currentRowItems = tableData[rowIndex];

            // 从AntItem数组中找到Id对应的项（根据GetRecipeItem方法，Id是第一个元素）
            var idItem = currentRowItems.FirstOrDefault(item => item.key == "Id");
            var idValue = idItem.value;
           

            // 使用Id值进行查询操作（注意：需要根据实际Id类型调整，这里假设是int类型）
            var queryResult = SqlHelper.sqliteDb.Queryable<RecipeModel>()
                .Where(m => m.Id == Convert.ToInt32(idValue)) // 根据实际类型修改转换方式
                .First();
            lab_length.Text = queryResult.length.ToString();
            lab_prefix.Text = queryResult.prefix.ToString();
            lab_recipe.Text = queryResult.recipe.ToString();
            lab_prodouct.Text = queryResult.product.ToString();
            lab_medium.Text = queryResult.MediumCount.ToString();
            lab_out.Text = queryResult.OuterCount.ToString();
            // 这里可以添加对查询结果的处理逻辑


        }

       
    }
}
